#include "main.h"

/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(LNode** head) {
	*head = (LNode*)malloc(sizeof(LNode));
	(*head)->next = NULL;
	if (!*head) {
		return 1;
	}
	return 0;
}

/* 函数返回由head所表示的单链表的长度。*/
int ListLength(LNode* head) {
	LNode* cur = head;
	int size = 0;
	while (cur->next != NULL) {
		cur = cur->next;
		size++;
	}
	return size;
}

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(LNode* head, int i, DataType x) {
	LNode* newnode = (LNode*)malloc(sizeof(LNode));
	LNode* posPrev = head;
	int k = -1;
	while (posPrev && k < i - 1) {
		posPrev = posPrev->next;
		k++;
	}
	if (!posPrev || k < i - 1)
	{
		return 1;
	}
	newnode->data = x;
	newnode->next = posPrev->next;
	posPrev->next = newnode;
	return 0;
}

int ListDelete(LNode* head, int i, DataType* x) {
	LNode* p = head;
	int j = -1;
	while (p->next && j < i - 1) {
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i) {
		return 1;
	}
	LNode* pos = p->next;
	p->next = pos->next;
	*x = pos->data;
	free(pos);
	return 0;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(LNode *head, int i, DataType *x) {
	LNode* prev = head;
	int j = -1;
	while (prev && j < i) {
		prev = prev->next;
		j++;
	}
	if (!prev || j > i) {
		return 1;
	}
	*x = prev->data;
	return 0;
}

// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(LNode** head) {

	LNode* cur = *head;
	LNode* next;
	while (cur) {
		next = cur;
	    cur =  cur->next;
		free(next);
	}
	*head = NULL;
	if (*head == NULL) {
		return 0;
	}
	return 1;
}
